
// 定义游戏状态机模块
module fsm(
    input rst_n,          // 异步复位信号，低电平有效
    input clk,            // 系统时钟
    input hit_wall,       // 碰撞到墙壁信号
    input hit_itself,     // 碰撞到自身信号
    input turn_up,
	input turn_down,
	input turn_left,
	input turn_right,  		// 方向控制信号
    output reg [1:0] game_status,  // 游戏状态输出
	output reg [1:0] game_level    // 游戏级别输出
);
	
// ************ parameter define ***********
// 定义游戏状态参数
parameter LAUNCHING=2'b00;  // 启动状态
parameter PLAYING=2'b01;    // 游戏进行中状态
parameter DIE_FLASHING=2'b10;  // 死亡闪烁状态
parameter INITIALIZING=2'b11;  // 初始化状态

// 定义计数器，用于死亡闪烁的延时
reg [27:0] count_two;    

// 主状态机逻辑
always @(posedge clk or negedge rst_n) begin
    if(~rst_n)begin
        // 复位逻辑
        game_status<=LAUNCHING;
        count_two<=0;
        game_level<='d0;
    end
    else begin
        case(game_status)
            LAUNCHING:begin
                // 启动状态下，根据用户输入选择游戏级别并开始游戏
                if(turn_up)begin
                    game_level<='d0;
                    game_status<=PLAYING;
                end
                else if(turn_down)begin
                    game_level<='d1;
                    game_status<=PLAYING;
                end
                else if(turn_left || turn_right)begin
                    game_level<='d2;
                    game_status<=PLAYING;
                end
            end
            INITIALIZING:begin
                // 初始化状态下，逻辑同启动状态
                if(turn_up)begin
                    game_level<='d0;
                    game_status<=PLAYING;
                end
                else if(turn_down)begin
                    game_level<='d1;
                    game_status<=PLAYING;
                end
                else if(turn_left || turn_right)begin
                    game_level<='d2;
                    game_status<=PLAYING;
                end
            end
            PLAYING:begin
                // 游戏进行中，检测碰撞信号
                if(hit_wall || hit_itself)begin
                    game_status<=DIE_FLASHING;
                end
            end
            DIE_FLASHING:begin
                // 死亡闪烁状态，达到计数后进入初始化状态
                if (count_two==200000000) begin 
                    game_status<=INITIALIZING;
                    game_level<='d0;
                    count_two<=0; 
                end
                else 
                    count_two<=count_two+1; // 计数器加一，用于延时
            end
            default:begin
                // 默认状态下，回到启动状态
                game_status<=LAUNCHING;
                game_level<='d0;
            end
        endcase
    end
end

endmodule
